package cn.yrec.rain.analysis.utils;


import cn.hutool.core.util.NumberUtil;

import java.math.BigDecimal;

/**
 *
 * 功能描述: 数字处理工具类
 * 作者： 朱朋涛
 * 日期： 2019年12月15日 上午9:48:27
 * 版本：V1.0
 */
public class NumberUtils {
    public static BigDecimal round(BigDecimal value, int scale, int roundingMode){
        if(value == null) value = new BigDecimal(0);
        value = value.setScale(scale, roundingMode);
        return value;
    }

    /**
     * 方法描述: 对数值进行精度取值(四舍五入)
     * @author yanglichen
     * @date 2021-06-29 10:32
     * @param value 待处理的数
     * @param scale 保留几位数
     */
    public static BigDecimal round(BigDecimal value, int scale){
        if(value == null) value = new BigDecimal(0);
        value = value.setScale(scale, BigDecimal.ROUND_HALF_UP);
        return value;
    }

    /**
     * 方法描述: 对数值进行精度取值(四舍五入)
     * @author yanglichen
     * @date 2021-06-29 10:32
     * @param value 待处理的数
     * @param scale 保留几位数
     */
    public static Double round(Double value, int scale){
        if (value == null) {
            return 0D;
        }
        BigDecimal bigDecimal = new BigDecimal(value);
        return bigDecimal.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


    /**
     * 方法描述: BigDecimal数值相加
     * @author yanglichen
     * @date 2021-06-29 10:33
     * @param value1 数1
     * @param value2 数2
     **/
    public static BigDecimal sum(BigDecimal value1, BigDecimal value2){
        if(value1 == null) value1 = new BigDecimal(0);
        if(value2 == null) value2 = new BigDecimal(0);
        return value1.add(value2);
    }

    /**
     * 方法描述: 求和
     * @author yanglichen
     * @date 2021-06-29 10:33
     * @param value1 数1
     * @param values 其他数
     */
    public static BigDecimal sum(BigDecimal value1, BigDecimal... values){
        if(value1 == null) value1 = new BigDecimal(0);
        for(BigDecimal value : values){
            if(value == null) value = new BigDecimal(0);
            value1 = value1.add(value);
        }
        return value1;
    }

    /**
     * 方法描述: 数值相减
     * @author yanglichen
     * @date 2021-06-29 10:34
     * @param value1 数1
     * @param value2 数2
     **/
    public static BigDecimal sub(BigDecimal value1, BigDecimal value2){
        if(value1 == null) value1 = new BigDecimal(0);
        if(value2 == null) value2 = new BigDecimal(0);
        return value1.subtract(value2);
    }

    /**
     * 方法描述: 数值相减
     * @author yanglichen
     * @date 2021-06-29 10:35
     * @param value1 数1
     * @param values 其他数
     * @return
     **/
    public static BigDecimal sub(BigDecimal value1, BigDecimal... values){
        if(value1 == null) value1 = new BigDecimal(0);
        for(BigDecimal value : values){
            if(value == null) value = new BigDecimal(0);
            value1 = value1.subtract(value);
        }
        return value1;
    }

    /**
     * 方法描述: 数字相乘
     * @author yanglichen
     * @date 2021-06-29 10:36
     * @param value1 数1
     * @param value2 数2
     * @return
     **/
    public static BigDecimal mul(BigDecimal value1, BigDecimal value2) {
        if (value1 == null)value1 = new BigDecimal(0);
        if (value2 == null)value2 = new BigDecimal(0);
        return value1.multiply(value2);
    }

    /**
     * 方法描述: double数值相除
     * @author yanglichen
     * @date 2021-06-29 10:36
     * @param value1 数1
     * @param value2 数2
     * @return
     **/
    public static BigDecimal div(BigDecimal value1, BigDecimal value2){
        if(value1 == null) value1 = new BigDecimal(0);
        if(value2 == null) value2 = new BigDecimal(0);
        //保留2位有效数字，四舍五入
        return value1.divide(value2, 2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 方法描述: double数值相除
     * @author yanglichen
     * @date 2021-06-29 10:36
     * @param value1 数1
     * @param value2 数2
     * @param scale 保留几位数
     * @return
     **/
    public static BigDecimal div(BigDecimal value1, BigDecimal value2, int scale){
        if(value1 == null) value1 = new BigDecimal(0);
        if(value2 == null) value2 = new BigDecimal(0);
        //保留scale位有效数字，四舍五入
        return value1.divide(value2, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 方法描述: 根据字符串格式的小数得到BigDecimal对象
     * @author yanglichen
     * @date 2022-02-11 11:18
     * @param doubleValueStr 字符串格式的小数
     * @return
     **/
    public static BigDecimal getDoubleByStr(String doubleValueStr) {
        return BigDecimal.valueOf(Double.valueOf(doubleValueStr));
    }
}
